package com.ayz.gateway.core.rpc;


import com.ayz.gateway.core.rpc.utils.NamingGenerator;
import com.google.common.base.Objects;
import lombok.Data;

/**
 * @ClassName MappedMethod
 * @Description TODO: HTTP资源和RPC资源的映射
 * @Author 快乐的星球
 * @Date 2023/5/8 14:17
 * @Version 1.0
 **/
@Data
public class MappedMethod {
    /**
     * http资源的路径
     */
    private String uri;

    /**
     * 服务应用程序的名称
     */
    private String applicationName;
    /**
     * 服务接口的名称
     */
    private String interfaceName;
    /**
     * 具体方法的名称
     */
    private String methodName;
    /**
     * 是否是同步调用
     */
    private boolean isSync;
    /**
     * 方法参数的全类路径名
     * 默认当前网关中只支持一个参数
     * 一个基础数据类型
     * 或者一个对象数据类型: 对象数据类型默认Map传输
     */
    private String[] parameterTypeNames;
    /**
     * 默认是false，也就是当前RPC资源不进行鉴权处理
     * 但记住,如果需要鉴权这里要设置成true
     */
    private boolean isAuth;

    public MappedMethod(String uri, String applicationName, String interfaceName, String methodName,boolean isSync,String parameterTypeName) {
        this.uri = uri;
        this.applicationName = applicationName;
        this.interfaceName = interfaceName;
        this.methodName = methodName;
        this.isSync=isSync;
        this.parameterTypeNames=new String[]{parameterTypeName};
    }

    /**
     * 获取资源唯一名称
     * @return
     */
    public String generateResourceName(){
        return NamingGenerator.generateRpcResourceName(getApplicationName(),getInterfaceName(),getMethodName());
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MappedMethod that = (MappedMethod) o;
        return Objects.equal(getUri(), that.getUri()) && Objects.equal(getApplicationName(), that.getApplicationName()) && Objects.equal(getInterfaceName(), that.getInterfaceName()) && Objects.equal(getMethodName(), that.getMethodName());
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(getUri(), getApplicationName(), getInterfaceName(), getMethodName());
    }
}
